package com.completable;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.function.Consumer;

//异步调用和同步调用
public class CompletableFutureDemo {
//    public static void main(String[] args) throws Exception {
//        //同步调用
//        CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()->{
//            System.out.println(Thread.currentThread().getName()+" : CompletableFuture1");
//        });
//        completableFuture1.get();
//
//        //mq消息队列
//        //异步调用
//        CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(()->{
//            System.out.println(Thread.currentThread().getName()+" : CompletableFuture2");
//            //模拟异常
//            int i = 10/0;
//            return 1024;
//        });
//
//        completableFuture2.whenComplete((t,u)->{
//            System.out.println("------t="+t);
//            System.out.println("------u="+u);
//        }).get();
//
//    }

    private static Integer num = 10;

    /**
     * 先对一个数加 10,然后取平方
     *
     * @param args
     */
//    public static void main(String[] args) throws Exception {
//        System.out.println("主线程开始");
//        CompletableFuture<Integer> future =
//                CompletableFuture.supplyAsync(() -> {
//                    try {
//                        System.out.println("加 10 任务开始");
//                        num += 10;
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                    }
//                    return num;
//                }).thenApply(integer -> {
//                    return num * num;
//                });
//        Integer integer = future.get();
//        System.out.println("主线程结束, 子线程的结果为:" + integer);
//    }
    public static void main(String[] args) throws Exception{
        System.out.println("主线程开始");
        CompletableFuture.supplyAsync(() -> {
            try {
                System.out.println("加 10 任务开始");
                num += 10;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return num;
        }).thenApply(integer -> {
            return num * num;
        }).thenAccept(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println("子线程全部处理完成,最后调用了 accept,结果为:" +
                        integer);
            }
        });
    }

   
}
